<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <button onclick="add()">点击<span id="sp1">0</span></button>
    <script>
        //js作用域链
        function a1(){
            var num1=100;
            function aa1(){
                var num2=666;
                console.log(num1)
            }
            aa1()
            
        }
        a1()
        //让作用域链外部的可以使用，内部的数据，而且避免全局污染，就是用闭包

        //闭包的形式
        //当一个嵌套内部的函数引用了外部的变量，就产生了闭包
        function aa(){
            var num=1;
            return function(){
                return num++
            }
        }
        let c=aa()
        function add(){

            document.getElementById("sp1").innerText=c();
        }

        //形式2 将函数作为实参传递给另外一个函数
        // function showDelay(msg,time){
        //     setTimeout(function(){
        //         alert(msg)
        //     },time)
        // }
        // showDelay("学习js",2000)
        //闭包的作用延长数据存活的周期·让函数外部可以操作函数内部的数据
        //闭包的问题：
        //函数执行完毕之后，内存没有释放导致内存泄漏，长时间使用内存占有量大
        //意外的全局变量
        
        //解决方式  销毁内存的引用
        //及时清理计时器等回调函数
    </script>
</body>
</html>